package models

import (
	"errors"
	"fmt"
	"gorm.io/gorm"
	"time"
)

// ProPusherMsg 表示项目推送信息表
type ProPusherMsg struct {
	ID              uint64    `gorm:"primaryKey;autoIncrement" json:"id" form:"id"`
	ProjectID       uint64    `gorm:"column:project_id;notNull" json:"project_id" form:"project_id"`
	PusherName      string    `gorm:"column:pusher_name;size:255;notNull" json:"pusher_name" form:"pusher_name"`
	PusherEmail     string    `gorm:"column:pusher_email;size:255;notNull" json:"pusher_email" form:"pusher_email"`
	SenderHTMLURL   string    `gorm:"column:sender_html_url;size:255;notNull" json:"sender_html_url" form:"sender_html_url"`
	CommitMessage   string    `gorm:"column:commit_message;type:text;notNull" json:"commit_message" form:"commit_message"`
	CommitTimestamp time.Time `gorm:"column:commit_timestamp;type:datetime;notNull" json:"commit_timestamp" form:"commit_timestamp"`
	Compare         string    `gorm:"column:compare;size:255" json:"compare" form:"compare"`
}

// TableName 返回表名
func (ProPusherMsg) TableName() string {
	return "pro_pusher_msg"
}

//	GetProPusherMsgByProjectID
//
// 描述信息： 根据 project_id 查询最近五个推送者的信息
//
// Param：
//
//	db ：数据库连接实例
//	projectID ：项目id
//
// Return：
//
//	[]ProPusherMsg ：推送这列表
//	error ：错误信息
func GetProPusherMsgByProjectID(db *gorm.DB, projectID uint64) ([]ProPusherMsg, error) {
	var pusherMsgs []ProPusherMsg
	result := db.Where("project_id = ?", projectID).Order("commit_timestamp DESC").Limit(5).Find(&pusherMsgs)

	// 如果查询出错，且错误不是“未找到记录”的错误，则返回错误
	if result.Error != nil && !errors.Is(result.Error, gorm.ErrRecordNotFound) {
		return nil, result.Error
	}

	// 如果查询不到记录，返回空切片
	return pusherMsgs, nil
}

//	InsertProPusherMsg
//
// 描述信息： 插入一条数据到数据库
//
// Param：
//
//	db ：数据库链接实例
//	projectID ：项目id
//	pusherName ：推送人名称
//	pusherEmail ：推送者邮箱
//	senderHTMLURL ：推送人html页面url
//	commitMessage ：推送的消息
//	compare ：推送前后对比url
//	commitTimestamp ：推送时间
//
// Return：
//
//	error ：错误信息
func (p ProPusherMsg) InsertProPusherMsg(db *gorm.DB, projectID uint64, pusherName, pusherEmail, senderHTMLURL, commitMessage, compare string, commitTimestamp time.Time) error {
	// 创建 ProPusherMsg 实例
	pusherMsg := ProPusherMsg{
		ProjectID:       projectID,
		PusherName:      pusherName,
		PusherEmail:     pusherEmail,
		SenderHTMLURL:   senderHTMLURL,
		CommitMessage:   commitMessage,
		CommitTimestamp: commitTimestamp,
		Compare:         compare,
	}

	// 插入数据
	result := db.Create(&pusherMsg)
	if result.Error != nil {
		return result.Error
	}
	return nil
}

//	GetProPusherMsgsByProjectID
//
// 描述信息： project_id 查询所有推送消息，按时间降序排列
//
// Param：
//
//	db ：mysql数据库查询实例
//	projectID ：项目id
//
// Return：
//
//	[]ProPusherMsg ：项目的推送信息
//	error ：错误信息
func (p ProPusherMsg) GetProPusherMsgsByProjectID(db *gorm.DB, projectID uint64) ([]ProPusherMsg, error) {
	var pusherMsgs []ProPusherMsg
	result := db.Where("project_id = ?", projectID).Order("commit_timestamp DESC").Find(&pusherMsgs)

	// 如果查询出错，且错误不是“未找到记录”的错误，则返回错误
	if result.Error != nil && !errors.Is(result.Error, gorm.ErrRecordNotFound) {
		return nil, result.Error
	}

	// 如果查询不到记录，返回空切片
	return pusherMsgs, nil
}

// DeleteProPusherMsgByProjectID 根据 project_id 删除所有相关的 ProPusherMsg 记录
func (p ProPusherMsg) DeleteProPusherMsgByProjectID(db *gorm.DB, projectID uint64) error {
	result := db.Where("project_id = ?", projectID).Delete(&ProPusherMsg{})
	if result.Error != nil {
		return fmt.Errorf("failed to delete pro pusher messages with project_id %d: %w", projectID, result.Error)
	}
	return nil
}
